# 作者:杨新远
# 2025年02月24日20时32分49秒
# 2273695640@qq.com
from operator import itemgetter, attrgetter

str_list = "This is a test string from Andrew".split()
print(str_list)

new_str_list = sorted(str_list)
print(f'id(new_str_list)={id(new_str_list)},id(str_list)={id(str_list)}')


def str_lower(str1: str):
    """
    比较规则函数
    :param str1:
    :return:
    """
    return str1.lower()


# str_lower函数是sorted内部进行调用的
print(sorted(str_list, key=str_lower))
print(sorted(str_list, key=str.lower))
print('-' * 50)
student_tuples = [
    ('john', 'A', 15),
    ('jane', 'B', 12),
    ('dave', 'B', 10),
]
print(sorted(student_tuples, key=lambda x: x[2::-1]))  # step为负，start>stop
print('-' * 50)


class Student:
    def __init__(self, name, grade, age):
        self.name = name
        self.grade = grade
        self.age = age

    def __repr__(self):
        """
        类似str，repr可以返回其他类型(元组类型
        :return:
        """
        return repr((self.name, self.grade, self.age))


student_objects = [
    Student('茜特拉莉', 'A', 125),
    Student('芙莉莲', 'B', 351),
    Student('玛薇卡', 'C', 101)
]
# 当 sorted() 函数遍历 student_objects 列表时，lambda 函数的参数 student
# 会依次绑定到列表中的每个元素。由于 student_objects 列表中的元素都是 Student 类的实例，
# 因此 student 自然就是 Student 类的实例
print(sorted(student_objects, key=lambda student: student.name))
print(sorted(student_tuples, key=itemgetter(2)))  # 用于元组或者列表
print(sorted(student_objects, key=attrgetter('name')))  # 用于对象
print('-' * 50)
mydict = {'Li': ['M', 7],
          'Zhang': ['E', 2],
          'Wang': ['P', 3],
          'Du': ['C', 2],
          'Ma': ['C', 9],
          'Zhe': ['H', 7]}

for v in mydict.items():
    print(v)
    # lambda v: v[1][1] 表示以字典值的第二个元素作为排序依据
print(sorted(mydict.items(), key=lambda v: v[1][1]))

# 定义要排序的元组列表
tuples = [(3, 5), (1, 2), (2, 4), (3, 1), (1, 3)]
print('-' * 50)
# 先顺序排元组的第一个元素，再逆序排第二个元素
sorted_tuples = sorted(tuples, key=lambda x: (x[0], -x[1]))
print(sorted_tuples)
print('-' * 50)
import copy


def use_copy():
    a = [12, 22]
    b = [33, 44]
    c = copy.copy(a)  # copy.copy 是浅copy，主要是复制自定义对象
    print(c)
    a[0] = 50
    print(c)  # a变c也变（浅copy相当于只复制a这个标签，而不复制[12,22]）


def use_deepcopy():
    a = [12, 22]
    b = [33, 44]
    c = [a, b]
    d = copy.deepcopy(c)  # 递归的进行copy，直到不可变数据类型
    # d=c.copy()  #列表的copy是浅copy
    print(f'id(c)={id(c)},id(d)={id(d)}')  # id不一样
    print(f'id(c[0])={id(c[0])},id(d[0])={id(d[0])}')  # id不一样
    print(f'd={d}')
    print(f'c={c}')
    a[0] = 50
    print(f'd={d}')  # d不变
    print(f'c={c}')


# 自定义对象，对象内有一个属性，这个属性又是另外一个对象
if __name__ == '__main__':
    use_deepcopy()
